gtksearchentry: Add a "catchall" click gesture handler
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 23 Aug 2021 13:33:32 +0000 (15:33 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 23 Aug 2021 13:38:33 +0000 (15:38 +0200)
This gesture is set on the whole widget surface, since there's
multiple input targets inside an entry (icons, the GtkText itself)
it makes sense to consider the full entry an area handling clicks.
Ensure these events don't propagate further up, and result in other
actions.

gtk/gtksearchentry.c

index ebee7426224868b75867d64bd3f30282af5df6f6..6708fcc3af75e828871683435ea79df6f7d00a5c 100644 (file)
@@ -579,11 +579,21 @@ activate_cb (GtkText  *text,
   g_signal_emit (data, signals[ACTIVATE], 0);
 }
 
+static void
+catchall_click_press (GtkGestureClick *gesture,
+                      int              n_press,
+                      double           x,
+                      double           y,
+                      gpointer         user_data)
+{
+  gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+}
+
 static void
 gtk_search_entry_init (GtkSearchEntry *entry)
 {
   GtkWidget *icon;
-  GtkGesture *press;
+  GtkGesture *press, *catchall;
 
   /* The search icon is purely presentational */
   icon = g_object_new (GTK_TYPE_IMAGE,
@@ -615,6 +625,12 @@ gtk_search_entry_init (GtkSearchEntry *entry)
   g_signal_connect (press, "released", G_CALLBACK (gtk_search_entry_icon_release), entry);
   gtk_widget_add_controller (entry->icon, GTK_EVENT_CONTROLLER (press));
 
+  catchall = gtk_gesture_click_new ();
+  g_signal_connect (catchall, "pressed",
+                    G_CALLBACK (catchall_click_press), entry);
+  gtk_widget_add_controller (GTK_WIDGET (entry),
+                             GTK_EVENT_CONTROLLER (catchall));
+
   gtk_widget_add_css_class (GTK_WIDGET (entry), I_("search"));
 }